Tools:
- DSMapStudio

Apply it to a point on the blade

The "easy" way to permanently add an sfx to a weapon is to set a "residentSfxId" of an existing one and set its "residentSfx_DmyId" to a DmyId (attach point on the flver model) that you can look up in "DSAnimStudio".
The issue is that you can't cover the whole blade of the weapon but only attach it to one point. You could modify the actual sfx (meaning the .fxr file) but this would be too much hassle.

Apply it to the whole blade

We will now instead create 2 SpEffects with the first one always applied on the weapon and the second (containing the sfx) being triggered by the first one.
Why? Because if you load the game everything in the SpEffect is applied except the sfx. That's why we trigger the second one with the first one and then it works.

Open "DSMapStudio" -> "Param Editor":

1. Pick an existing "SpEffectParam" entry e.g. "1626000 [Incantation] Black Flame Blade"
2. Duplicate it (Ctrl+D) and give it the ID: "1626002"
3. Duplicate it again and give the 2nd one the ID: "1626003"
4. Duplicate the "SpEffectVfxParam" and give it the ID: "1626003"
5. Give your weapon in "EquipParamWeapon" in the field "residentSpEffectId" the 1st ID from 2.: "1626002"
6. Go to "SpEffectParam" entry "1626002" and delete all the stuff that isn't needed anymore especially set "vfxId" to "-1" and "wepParamChange" to "0"
7. Set "effectEndurance" to a high number e.g. "1000000" and "motionInterval" to "0" ("effectEndurance" being "-1" doesn't trigger the second SpEffect for the sfx)
8. Set "cycleOccurrenceSpEffectId" field to the ID of the second one: "1626003"
9. Go to "SpEffectParam" entry "1626003" and delete all the stuff that isn't needed anymore especially set "wepParamChange" to "0"
10. Set "effectEndurance" to "-1", "motionInterval" to "0" and set "vfxId" to your entry "1626003"
11. Go to your "SpEffectVfxParam" entry "1626003" and go to the section with "enchantStartDmyId" fields. Here we can now set where the sfx should occur
12. The fields are already filled and "enchantStartDmyId_0" is set to "10300" (that's the right hand blade, also counts for two-handing) and "enchantEndDmyId_0" is set to "-1" so the sfx only ends at the end of the blade
13. We simply edit the field "enchantStartDmyId_1" and set it to "20300" instead. Now it will also work if we have the weapon in our left hand.

The side effect is that the weapon also has the sfx when sheathed.